iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
Modern Web

TypeScript 啟動!系列 第 10

[Day 10] TypeScript 類別與介面

  • 分享至 

  • xImage
  •  

今天終於步入到類別( Class )與介面( Interface )的章節了,在大型專案開發的過程中,往往離不開物件導向( object-oriented programming language )的概念,而其中類別就是組織龐大專案的重要零組件。 TypeScript 很大程度上借鑑於 C# ,並支援像是可見性修飾詞(visibility modifier)、 特性初始器( property initializer)、多型( polymorphism )、 裝飾器( decorator )和介面( interface )等功能,當然 JavaScript 的慣用語,如 mixin 也是還保留著,並盡可能擁有安全性。

類別( Class )

是物件導向程式設計(Object-Oriented Programming, OOP)中的核心概念,類別不僅定義了物件的屬性和函式,允許程式繼承和多型。這意味著我們可以建立一個新的類別,繼承現有類別的屬性和方法,同時還可以覆蓋或擴展它們。這使得程式碼更具可讀性和可重用性。

類別:視為一個模板或藍圖,用於創建具體的物件(實例)。例如,「汽車」可以是一個類別,而具體的「Toyota Corolla」或「Honda Civic」則是由該類別建立的實例。

在高中生物課本上有一種專門分類動植物的系統叫做生物分類法,其中就以「界門綱目科屬種」為主,像是人類就是動物界→脊索動物門→哺乳綱→靈長目…,也就是說透過這些事先定義好的「界門綱目科屬種」我們也能自己創造某個動物,只要他們符合曾經設計的藍圖。

TypeScript Class 與 JavaScript Class 是不一樣的東西,但是最後編譯完成還是會變成類似的東西。

定義與建構函式

class Person {
    name: string;
    age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }

    introduction() {
        console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
    }
}

使用 class 宣告一個類別為 Person ,並在其中定義了一些屬性( name, age )、 constructor 作為建構子(類別建立的時候,會先進行運作的函式)和一個函式 introduction 。 也就是未來我建立了其他如學生、老師的時候也通常會有這些東西。(可以大幅減少程式碼的重複性)。

存取修飾符

class Car {
    public brand: string;
    private model: string;
    protected year: number;
}
  • public:公開訪問。
  • private:只能在類別內部訪問。
  • protected:可以在類別內部和所有子類別中訪問。

繼承

class Teacher extends Person {
    suject: string;

    constructor(name: string, age: number, suject: string) {
        super(name, age);
        this.suject = suject;
    }

    introduce() {
        super.introduction();
        console.log(`I teach the ${this.suject}.`);
    }
}
  • extends :繼承於某某的功能或屬性。
  • super :可以讓我們去調用父類別( Person )的東西。

介面(Interface)

介面主要用來定義物件的約定結構。它不包含具體的執行,只是提供了一個 約定

定義與實踐

interface PersonInterface {
    name: string;
    age: number;
    introduction(): void;
}

class Student implements PersonInterface {
    name: string;
    age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }

    introduction() {
        console.log(`Hi! I'm a student named ${this.name}.`);
    }
}
  • implements :用來實踐( interface)時用的關鍵字。

可選與唯讀屬性

interface PersonInterface {
    name: string;
    gender?: string;  // 可選屬性
    readonly age: string;  // 唯讀屬性
}

函數型接口

interface IntroductionFunc {
    (name: string): void;
}

let introduction: IntroductionFunc;
add = (name) => console.log(name);

當然類別與介面的部分章節其實沒有這麼少,但是如果在介紹下去可能就沒時間用小專案了,因此我覺得還是把進階的東西留到後面一點去講~很開心與大家一起完成這十天來有關於 TypeScript 的基礎認知,但正如古人所言,讀萬卷書不如行萬里路,學習的過程中,真正能讓知識鞏固的往往來自於實踐。因此接下來的幾天將會開始動手寫一個小專案,開始將理論轉換為實踐,希望各位能陪我一起繼續走下去~


上一篇
[Day 09] TypeScript 函式/函數 II
下一篇
[Day 11] TypeScript 對話小專案
系列文
TypeScript 啟動!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言